/**
 * wdk.com Inc.
 * Copyright (c) 2004-2019 All Rights Reserved.
 */
package com.da.javatest.enums;

import org.apache.commons.lang3.StringUtils;

/**
 * 错误码枚举
 */
public enum ErrorCodeEnum {

    //========================================================================//
    //                        公共类错误码[0000-0099]                            //
    //========================================================================//
    SUCCESS("0000", "处理成功"),

    UNKNOWN_EXCEPTION("9999", "其它未知异常"),

    ILLEGAL_PARAMETER("0001", "请求参数非法"),

    DATABASE_ERROR("0002", "数据库错误"),

    CONFIG_ERROR("0003", "配置错误"),

    DOMAIN_NOT_EXIST("0004", "数据对象不存在"),

    DOMAIN_HAS_EXIST("0005", "数据对象已存在"),

    MUTEX_ERROR("0006", "业务幂等"),

    CLASS_NOT_FOUND("0007", "找不到类"),

    GET_LOCK_FAILED("0008", "获取锁失败"),

    DB_TRANSACTION_ERROR("0009", "数据库事务提交失败"),

    // 特殊异常：0010-0013，会触发scatter框架启动熔断流程start
    NETWORK_EXCEPTION("0010", "网络异常"),
    TIMEOUT_EXCEPTION("0011", "超时异常"),
    HSF_EXCEPTION("0012", "HSF异常"),
    HTTP_EXCEPTION("0013", "http异常"),
    // 特殊异常，会引发scatter框架启动熔断流程end

    //========================================================================//
    //                           业务自定义错误码[0100-0999]                     //
    //========================================================================//

    PRODUCT_MUST_ONE_SALETYPE_ERROR("0100", "一个货品只能有一种经营方式"),

    MULTI_RELATION_ERROR("0101", "品仓商记录有多条"),

    OTHER_SUPPLIER_ERROR("0102", "该品已经有其他供应商"),

    MAIN_SUPPLIER_EXISTS_ERROR("0103", "该品已经存在主供应商"),

    ONLY_SUPPORT_DIST2CON_ERROR("0104", "只支持代转经/寄"),

    HAS_NO_SOURCE_SRP("0105", "没有历史品仓商记录"),

    ONLY_SUPPORT_SUPREP_CONS_ERROR("0106", "供应商汰换只支持代销和寄售"),

    BRAND_TEMPLATE_NO_CONFIG("0107", "品牌仓模板未配置"),

    PRODUCT_TEMPLATE_NO_CONFIG("0108", "货品仓模板未配置"),

    PRODUCT_HAS_OTHER_SUPPLIER("0109", "货品已存在其他供应商"),

    ITEM_NOT_EXIST("0110", "商品记录不存在"),

    ITEM_HAVE_NO_PRODUCTS("0111", "商品下无货品记录"),

    SUPPLIER_NOT_EXIST("0112", "供应商不存在"),

    SUPPLY_PROPERTIES_CONFLICT("0113", "品仓商属性冲突"),

    ;

    /**
     * 错误编码
     */
    private final String code;

    /**
     * 描述说明
     */
    private final String desc;

    /**
     * 私有构造函数。
     *
     * @param code 错误编码
     * @param desc 描述说明
     */
    ErrorCodeEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    /**
     * 通过枚举<code>code</code>获得枚举
     *
     * @param code 枚举编码
     * @return 支付错误明细枚举
     */
    public static ErrorCodeEnum getByCode(String code) {
        if (StringUtils.isBlank(code)) {
            return null;
        }

        for (ErrorCodeEnum detailCode : values()) {
            if (detailCode.getCode().equals(code)) {
                return detailCode;
            }
        }

        return null;
    }

    /**
     * 默认版本为0
     */
    final static String DEFAULT_VERSION = "1";
    /**
     * 留用位
     */
    final static String FOR_FUTURE = "1";
    /**
     * 应用分配编号
     */
    final static String APP_TAG = "0001";

    /**
     * @return 返回格式化后的错误码, 最终生成的错误码为: SRP110001XXXX (后4为即为枚举的code字段)
     */
    public String getErrorCode() {
        return "SRP" + DEFAULT_VERSION + FOR_FUTURE + APP_TAG + this.getCode();
    }

    /**
     * Getter method for property <tt>code</tt>.
     *
     * @return property value of code
     */
    public String getCode() {
        return code;
    }

    /**
     * Getter method for property <tt>desc</tt>.
     *
     * @return property value of desc
     */
    public String getDesc() {
        return desc;
    }
}